﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using personalplaner.common.mvvm;
using System.Windows;
using System.Windows.Input;
using personalplaner.common.mvvm.commands;
using System.Windows.Controls;
using personalplaner.gui.stamm.views;
using personalplaner.gui.stamm.viewmodels.models;
using personalplaner.servicemodel.dataaccess;
using System.Collections.ObjectModel;
using personalplaner.business.stamm;
using personalplaner.gui.common;
using personalplaner.business;

namespace personalplaner.gui.stamm.viewmodels
{
    public class AddPersonWizardViewModel : BaseViewModel
    {
        public AddPersonWizardViewModel(DependencyObject parent)
            : base(parent)
        {
        }

		public override void Loaded()
		{
			var mw = GetService<IMainWindowDisplayContainer>();
			mw.IsWaitVisible = false;
		}

        #region Commands

        #region General

        ICommand _okcommand;
        public ICommand OkCommand
        {
            get
            {
                if (_okcommand == null)
                    _okcommand = new RelayCommand(OnOkCommand, CanExecuteOk);
                return _okcommand;
            }
        }

        private void OnOkCommand(object parameter)
        {
            var wnd = Parent as Window;
            if (wnd == null)
                throw new Exception();

            //save the data
            Personalien.ArbeitsPensum = AdditionalInfoModel.Pensum;
            var pda = GetService<IPersonDataAccess>();
            _prsID = pda.SavePerson(Personalien, AdditionalInfoModel.Von, AdditionalInfoModel.Bis, AdditionalInfoModel.Anstellung.AnstellungID);

            //Abteilungen
            var pada = GetService<IAbteilungDataAccess>();
            foreach (var abt in PersonAbteilungModel.AbteilungenZugeteilt)
            {
                pada.SetPersonAbteilung(PrsID, abt.AbteilungID, abt.Von, abt.Bis, abt.Prozent);
            }

            wnd.DialogResult = true;
            wnd.Close();
        }

        private bool CanExecuteOk(object parameter)
        {
            RaisePropertyChanged("IsEndOfWizard");
            return IsEndOfWizard && PersonAbteilungModel.AbteilungenZugeteilt.Count > 0;
        }

        ICommand _cancelcommand;
        public ICommand CancelCommand
        {
            get
            {
                if (_cancelcommand == null)
                    _cancelcommand = new RelayCommand(OnCancelCommand);
                return _cancelcommand;
            }
        }

        private void OnCancelCommand(object parameter)
        {
            var wnd = Parent as Window;
            if (wnd == null)
                throw new Exception();

            wnd.DialogResult = false;
            wnd.Close();
        }

        ICommand _nextcommand;
        public ICommand NextCommand
        {
            get
            {
                if (_nextcommand == null)
                    _nextcommand = new RelayCommand(OnNext, parameter => SelectedView != Views[2]);
                return _nextcommand;
            }
        }

        private void OnNext(object parameter)
        {
            if (IsEndOfWizard)
                return;

            if (SelectedView is PersonalienView)
            {
                if (!Personalien.IsValid)
                    return;
            }
            else if (SelectedView is PersonAdditionalInfoView)
            {

            }
            else if (SelectedView is PersonaAbteilungView)
            {
            }


            for (int i=0;i< Views.Count;i++)
            {
                if (Views[i] == SelectedView)
                {
                    SelectedView = Views[i + 1];
                    break;
                }
            }


            if (SelectedView is PersonalienView)
            {
            }
            else if (SelectedView is PersonAdditionalInfoView)
            {
            }
            else if (SelectedView is PersonaAbteilungView)
            {
                PersonAbteilungModel.MaxPensum = AdditionalInfoModel.Pensum;
                PersonAbteilungModel.Pensum = PersonAbteilungModel.MaxPensum;

                PersonAbteilungModel.Von = AdditionalInfoModel.Von;
                PersonAbteilungModel.Bis = AdditionalInfoModel.Bis;

                var da = GetService<IAbteilungDataAccess>();

                PersonAbteilungModel.AbteilungenZugeteilt.Clear();
                PersonAbteilungModel.AbteilungenNichtZugeteilt.Clear();
                var lst = da.GetPersonAbteilungen(0, false);
                foreach (var itm in lst)
                    PersonAbteilungModel.AbteilungenNichtZugeteilt.Add(itm);
            }
        }

        ICommand _previouscommand;
        public ICommand PreviousCommand
        {
            get
            {
                if (_previouscommand == null)
                    _previouscommand = new RelayCommand(OnPrevious, parameter => SelectedView != Views[0]);
                return _previouscommand;
            }
        }

        private void OnPrevious(object parameter)
        {
            for (int i = 0; i < Views.Count; i++)
            {
                if (Views[i] == SelectedView)
                {
                    SelectedView = Views[i - 1];
                    break;
                }
            }
        }

        #endregion

        #region Abteilung


        //private ICommand _addAbteilungCommand;
        //public ICommand AddAbteilungCommand
        //{
        //    get
        //    {
        //        if (_addAbteilungCommand == null)
        //            _addAbteilungCommand = new RelayCommand(OnAddAbteilung, parameter => PersonAbteilungModel.AbteilungenZugeteilt.Count > 0);
        //        return _addAbteilungCommand;
        //    }
        //}

        //private void OnAddAbteilung(object parameter)
        //{
        //    var da = GetService<IAbteilungDataAccess>();
        //    da.RemovePersonAbteilung(PrsID, 0, PersonAbteilungModel.Von, PersonAbteilungModel.Bis);

        //    foreach (var itm in PersonAbteilungModel.AbteilungenZugeteilt)
        //        if (itm.AbteilungID > 0 && itm.Prozent > 0)
        //            da.SetAbteilung(PrsID, itm.AbteilungID, PersonAbteilungModel.Von, PersonAbteilungModel.Bis, itm.Prozent);


        //    // refresh the data
        //    PersonAbteilungModel.AbteilungenZugeteilt.Clear();
        //    var lst = da.GetPersonAbteilungen(PrsID, true);
        //    foreach (var itm in lst)
        //        PersonAbteilungModel.AbteilungenZugeteilt.Add(itm);

        //    PersonAbteilungModel.AbteilungenNichtZugeteilt.Clear();
        //    lst = da.GetPersonAbteilungen(PrsID, false);
        //    foreach (var itm in lst)
        //        PersonAbteilungModel.AbteilungenNichtZugeteilt.Add(itm);


        //    AbteilungHistory.Clear();
        //    var hst = da.GetPersonAbteilungen(PrsID);
        //    foreach (var itm in hst)
        //        AbteilungHistory.Add(itm);

        //    RefreshPensumData();
        //}

        ICommand _addToListCommand;
        public ICommand AddToListCommand
        {
            get
            {
                if (_addToListCommand == null)
                    _addToListCommand = new RelayCommand(OnAddToList, parameter => PersonAbteilungModel.SelectedAbteilungNichtZugeteilt != null);
                return _addToListCommand;
            }
        }

        private void OnAddToList(object parameter)
        {
            if (PersonAbteilungModel.SelectedAbteilungNichtZugeteilt == null)
                return;

            if (PersonAbteilungModel.Pensum <= 0)
            {
                MessageBox.Show(Window.GetWindow(Parent), "Es wurde kein Pensum-Prozentsatz ausgewählt.\nBitte geben Sie ein Prozentsatz ein.", "Kein Prozentsatz", MessageBoxButton.OK);
                PersonAbteilungModel.RaiseMoveFocus("Pensum");
                return;
            }

            if (PersonAbteilungModel.IsValid)
            {
                if (PersonAbteilungModel.Von < PersonAbteilungModel.Bis)
                {
                    var abteilung = PersonAbteilungModel.SelectedAbteilungNichtZugeteilt;

                    PersonAbteilungModel.AbteilungenZugeteilt.Add(abteilung);
                    PersonAbteilungModel.AbteilungenNichtZugeteilt.Remove(abteilung);

                    abteilung.Von = PersonAbteilungModel.Von;
                    abteilung.Bis = PersonAbteilungModel.Bis;
                    abteilung.Prozent = PersonAbteilungModel.Pensum;

                    //PersonAbteilungModel.SelectedAbteilungNichtZugeteilt = null;
                    PersonAbteilungModel.Pensum = 0;

                    RefreshPensumData();
                }
            }
            else
            {
                MessageBox.Show(Window.GetWindow(Parent), "Ungültiger Pensum-Prozentsatz.\nBitte wälhlen Sie einen Prozentsatz zwischen 0 und " + PersonAbteilungModel.MaxPensum + " aus", "Ungültiger Prozentsatz", MessageBoxButton.OK);
                PersonAbteilungModel.RaiseMoveFocus("Pensum");
            }
        }

        ICommand _removeFromListCommand;
        public ICommand RemoveFromListCommand
        {
            get
            {
                if (_removeFromListCommand == null)
                    _removeFromListCommand = new RelayCommand(OnRemoveFromList, parameter => PersonAbteilungModel.SelectedAbteilungZugeteilt != null);
                return _removeFromListCommand;
            }
        }

        private void OnRemoveFromList(object parameter)
        {
            if (PersonAbteilungModel.SelectedAbteilungZugeteilt == null)
                return;

            var abteilung = PersonAbteilungModel.SelectedAbteilungZugeteilt;
            PersonAbteilungModel.AbteilungenZugeteilt.Remove(abteilung);
            PersonAbteilungModel.AbteilungenNichtZugeteilt.Add(abteilung);

            PersonAbteilungModel.Pensum = 0;

            RefreshPensumData();
        }

        #endregion

        #endregion

        internal void InitializeViewModel()
        {
            AdditionalInfoModel.Von = DateTime.Now;
            AdditionalInfoModel.Bis = DateTime.Now.AddYears(20);


            var da = GetService<IAbteilungDataAccess>();

            PersonAbteilungModel.AbteilungenNichtZugeteilt.Clear();
            var lst = da.GetPersonAbteilungen(0, false);
            foreach (var itm in lst)
                PersonAbteilungModel.AbteilungenNichtZugeteilt.Add(itm);

            //AbteilungHistory.Clear();
            //var hst = da.GetPersonAbteilungen(0);
            //foreach (var itm in hst)
            //    AbteilungHistory.Add(itm);

        }

        private void RefreshPensumData()
        {
            var pens = AdditionalInfoModel.Pensum;

            foreach (var itm in PersonAbteilungModel.AbteilungenZugeteilt)
                pens -= itm.Prozent;
            PersonAbteilungModel.MaxPensum = pens;
        }

        #region Properties

        #region Wizard

        IList<UserControl> _views;
        public IList<UserControl> Views
        {
            get
            {
                if (_views == null)
                {
                    _views = new List<UserControl>
                    {
                        new PersonalienView
                        {
                            DataContext = Personalien,
                            BorderThickness = new Thickness(0)
                        },
                        new PersonAdditionalInfoView(),
                        new PersonaAbteilungView()
                    };
                }
                return _views;
            }
        }

        UserControl _selectedView;
        public UserControl SelectedView
        {
            get
            {
                if(_selectedView==null)
                    _selectedView = Views[0];
                return _selectedView;
            }
            set
            {
                _selectedView = value;
                RaisePropertyChanged("SelectedView");
            }
        }

        public bool IsEndOfWizard
        {
            get
            {
                return SelectedView == Views[2];
            }
        }
        
        #endregion

		int _prsID;
		public int PrsID
		{
			get { return _prsID; }
		}

        #region Personalien

        Person _person;
        public Person Personalien
        {
            get
            {
                if (_person == null)
                    _person = new Person();
                return _person;
            }
        }

        #endregion

        #region Additional info

        PersonAdditionalInfoModel _personaadditionalinfomodel;
        public PersonAdditionalInfoModel AdditionalInfoModel
        {
            get
            {
                if (_personaadditionalinfomodel == null)
                    _personaadditionalinfomodel = new PersonAdditionalInfoModel();
                return _personaadditionalinfomodel;
            }
        }

        IList<Anstellung> _anstellungen;
        public IList<Anstellung> Anstellungen
        {
            get
            {
                if (_anstellungen == null)
                {
                    var da = GetService<IAnstellungDataAccess>();
                    _anstellungen = new ObservableCollection<Anstellung>(da.GetAnstellungen());

                    if (_anstellungen.Count > 0)
                        AdditionalInfoModel.Anstellung = _anstellungen[0];
                }
                return _anstellungen;
            }
        }

        #endregion

        #region Abteilung

        PersonAbteilungModel _personabteilungmodel;
        public PersonAbteilungModel PersonAbteilungModel
        {
            get
            {
                if (_personabteilungmodel == null)
                    _personabteilungmodel = new PersonAbteilungModel();
                return _personabteilungmodel;
            }
        }

        //IList<PersonAbteilung> _history;
        //public IList<PersonAbteilung> AbteilungHistory
        //{
        //    get
        //    {
        //        if (_history == null)
        //        {
        //            var da = GetService<IAbteilungDataAccess>();
        //            _history = new ObservableCollection<PersonAbteilung>(da.GetPersonAbteilungen(0));
        //        }
        //        return _history;
        //    }
        //}

        #endregion

        #endregion
    }
}
